/**
 * 
 */
package neptune.web.client.services.experiment;

import java.util.Map;

import neptune.web.client.model.ExperimentInfos;
import neptune.web.client.model.SerializableExperiment;
import neptune.web.client.model.topology.SerializableTopology;
import com.google.gwt.user.client.rpc.AsyncCallback;

/**
 * @author Roberto Bifulco [info@robertobifulco.it, robertobifulco.it]
 * 
 */
public interface ExperimentServiceAsync {

	/**
	 * Aggiunge un utente agli utenti dell'esperimento
	 * 
	 * @param username
	 * @param expId
	 * @param isSuperUser
	 * @throws SecurityException
	 * @throws SerializableException
	 */
	public void addUserToExperiment(String username, String expId,
			boolean isSuperUser, AsyncCallback<Boolean> callback);

	/**
	 * Effettua l'allocazione per il dato esperimento. Restituisce lo stato di
	 * tale esperimento al termine dell'operazione.
	 * 
	 * @param expId
	 * @return
	 * @throws SecurityException
	 * @throws Exception
	 */
	public void allocateExperiment(String expId, AsyncCallback<String> callback);
	
	/**
	 * Effettua l'allocazione per il dato esperimento mediante l'algoritmo di Lin Kernighan.
	 * Restituisce la descrizione del mapping effettuato.
	 * 
	 * @param expId
	 * @param maxVMsPerNode
	 * @param maxBandwidth
	 * @return
	 * @throws SecurityException
	 * @throws Exception
	 */
	public void allocateExperimentWithLinKernighan(String expId, int maxVMsPerNode, int maxBandwidth, AsyncCallback<String> callback);
	
	/**
	 * Effettua l'allocazione per il dato esperimento mediante l'algoritmo di Lin Kernighan.
	 * Ottimizza il processo di mapping attraverso l'allocazione di nodi virtuali su macchine fisiche
	 * che contengono nodi di altri esperimenti 
	 * Restituisce la descrizione del mapping effettuato.
	 * 
	 * @param expId
	 * @param maxVMsPerNode
	 * @param maxBandwidth
	 * @return
	 * @throws SecurityException
	 * @throws Exception
	 */
	public void allocateExperimentWithLinKernighanSharing(String expId, int maxVMsPerNode, int maxBandwidth, AsyncCallback<String> callback);
	

	/**
	 * Effettua l'allocazione per il dato esperimento adoperando una allocation
	 * map. Restituisce lo stato di tale esperimento al termine dell'operazione.
	 * 
	 * @param expId
	 * @param allocationMap
	 * @return
	 * @throws SecurityException
	 * @throws Exception
	 */
	public void allocateExperiment(String expId,
			Map<String, String[]> allocationMap, AsyncCallback<String> callback);

	/**
	 * Effettua una richiesta di allocazione per l'esperimento il cui id e'
	 * passato come argomento. Restituisce lo stato di tale esperimento al
	 * termine della richiesta.
	 * 
	 * @param expId
	 * @return
	 * @throws SecurityException
	 * @throws Exception
	 */
	public void allocationRequest(String expId, AsyncCallback<String> callback);

	/**
	 * 
	 * @param expName
	 * @throws ExperimentCreationException
	 * @throws SecurityException
	 */
	public void createExperiment(String expName, AsyncCallback<Boolean> callback);

	/**
	 * Effettua la deallocazione per il dato esperimento. Restituisce lo stato
	 * di tale esperimento al termine dell'operazione.
	 * 
	 * @param expId
	 * @return
	 * @throws SecurityException
	 * @throws Exception
	 */
	public void deallocateExperiment(String expId, AsyncCallback<String> callback);

	/**
	 * Elimina un esperimento
	 * 
	 * @param expId
	 * @throws SecurityException
	 * @throws SerializableException
	 */
	public void deleteExperiment(String expId, AsyncCallback<Boolean> callback);

	/**
	 * Effettua una nuova configurazione per il dato esperimento. Restituisce lo
	 * stato di tale esperimento al termine dell'operazione.
	 * 
	 * @param expId
	 * @return
	 * @throws SecurityException
	 * @throws Exception
	 */
	public void forceExperimentConfiguration(String expId, AsyncCallback<String> callback);

	/**
	 * Ottiene la lista degli identificativi dei nodi allocati per un dato
	 * esperimento, recuperando per ogni i-esimo nodo le seguenti informazioni:<br>
	 * <br>
	 * [i][0] = nodeId<br>
	 * [i][1] = nodeState<br>
	 * [i][2] = nodeControlIP<br>
	 * 
	 * @param expId
	 * @return
	 * @throws SecurityException
	 * @throws Exception
	 */
	public void getAllocatedNodes(String expId, AsyncCallback<String[][]> callback);

	/**
	 * Ottiene i dati riguardanti un esperimento
	 * 
	 * @param expId
	 * @return
	 * @throws SecurityException
	 * @throws SerializableException
	 */
	public void getExperiment(String expId, AsyncCallback<SerializableExperiment> callback);
	
	/**
	 * Ottiene la descrizione XML di un esperimento
	 * 
	 * @param idExperiment
	 * @return
	 * @throws SecurityException
	 * @throws Exception
	 */
	public void getXMLTopologyOfExperiment(String idExperiment, AsyncCallback<String> callback);

	/**
	 * Ottiene i valori necessari a popolare la tabella della
	 * ExperimentSummaryView. L'array bidimensionale restituito ha per ogni riga
	 * un esperimento e in ogni colonna i dati riguardanti gli esperimenti
	 * nell'ordine in cui sono visualizzati in tabella.
	 * 
	 * @param begin
	 * @param end
	 * @param sortId
	 * @param ascending
	 * @return
	 * @throws SecurityException
	 * @throws SerializableException
	 */
	public void getExperimentsTableData(int begin, int end, int sortId,
			boolean ascending, AsyncCallback<String[][]> callback);

	/**
	 * Restituisce lo stato del nodo nodeId, appartenente all'esperimento expId.
	 * 
	 * @param expId
	 * @param nodeId
	 * @return
	 * @throws SecurityException
	 * @throws Exception
	 */
	public void getNodeState(String expId, String nodeId, AsyncCallback<String> callback);

	/**
	 * Elimina un utente dagli utenti dell'esperimento
	 * 
	 * @param username
	 * @param expId
	 * @throws SecurityException
	 * @throws SerializableException
	 */
	public void removeUserFromExperiment(String username, String expId, AsyncCallback<Boolean> callback);

	/**
	 * Termina il dato esperimento. Restituisce lo stato di tale esperimento al
	 * termine dell'operazione.
	 * 
	 * @param expId
	 * @return
	 * @throws SecurityException
	 * @throws Exception
	 */
	public void terminateExperiment(String expId, AsyncCallback<String> callback);

	/**
	 * Carica la topologia di un esperimento sul server
	 * 
	 * @param expId
	 * @param topology
	 * @return
	 * @throws SecurityException
	 * @throws Exception
	 */
	public void uploadExperimentTopology(String expId,
			SerializableTopology topology, AsyncCallback<ExperimentInfos> callback);
	
	/**
	 * Carica la topologia di un esperimento sul server
	 * 
	 * @param expId
	 * @param xmlTopology
	 * @return
	 * @throws SecurityException
	 * @throws Exception
	 */
	public void uploadExperimentXMLTopology(String expId, String xmlTopology, AsyncCallback<ExperimentInfos> callback);
	

	/**
	 * Convalida la topologia associata all'esperimento il cui identificativo e'
	 * passato come argomento.
	 * 
	 * @param expId
	 * @return
	 * @throws SecurityException
	 * @throws Exception
	 */
	public void validateExperimentTopology(String expId, AsyncCallback<ExperimentInfos> callback);
}
